package com.junlinpro.utils;


import org.springframework.stereotype.Component;

import java.util.*;

@Component
public class BufferMemory4G {

    // tcp 缓存数据
    private Map<String, Vector<Byte>> tcpMemoryData = new Hashtable();
    // udp 缓存数据
    private Map<String, Vector<Byte>> udpMemoryData = new Hashtable();

    public void udpAdd(String ipKey, byte[] bs) {
        if (bs != null && bs.length > 0) {
            if (udpMemoryData.get(ipKey) != null && udpMemoryData.get(ipKey).size() > 0) {
                Vector<Byte> memoryData = udpMemoryData.get(ipKey);
                for (byte b : bs) {
                    memoryData.add(b);
                }
                udpMemoryData.put(ipKey, memoryData);
            } else {
                // 使用线程安全的集合
                Vector<Byte> memoryData = new Vector<>();
                for (byte b : bs) {
                    memoryData.add(b);
                }
                udpMemoryData.put(ipKey, memoryData);
            }
        }
    }

    public List<byte[]> udpGetData(String ipKey) {
        if (udpMemoryData.get(ipKey) != null) {

            Vector<Byte> memoryData = udpMemoryData.get(ipKey);
            if (memoryData != null) {

                List<byte[]> rtnData = new ArrayList<>();

                for (int i = 0; i < memoryData.size(); i++) {
                    // 判断是否是“4A 4C”开头（永远从头开始取）
                    if (memoryData.get(0) == 74) {
                        if (memoryData.get(1) == 76) {
                            // 数据的总长度
                            int totalLength = 0;
                            // 判断数据长度
                            if (memoryData.get(2) != null && memoryData.get(3) != null) {

                                ///System.out.println("--- 获得数据长度帧 ---");

                                // 获取数据长度位置相应的值
                                byte one = memoryData.get(2);
                                byte two = memoryData.get(3);

                                byte[] dataLength = new byte[]{one, two};

                                totalLength = ByteUtil.dataLengthToInt(dataLength);

                                //System.out.println("每帧应该取的长度：" + totalLength);

                                // 数据总长度大于要单针的长度
                                if (memoryData.size() >= totalLength) {
                                    byte[] retByteArray = new byte[totalLength];
                                    // 循环取出一个完整帧的数据
                                    for (int j = 0; j < totalLength; j++) {
                                        // 先存入再删除
                                        retByteArray[j] = memoryData.get(j);
                                    }
                                    if (retByteArray != null && retByteArray.length > 0) {
                                        for (int j = 0; j < retByteArray.length; j++) {
                                            memoryData.remove(0);
                                        }
                                        rtnData.add(retByteArray);
                                    }
                                } else {
                                    //memoryData.remove(0);
                                }
                            }
                        } else {
                            memoryData.remove(0);
                            memoryData.remove(1);
                        }
                    } else {
                        memoryData.remove(0);
                    }
                }
                udpMemoryData.remove(ipKey);
                return rtnData;
            } else {
                udpMemoryData.remove(ipKey);
                return null;
            }
        } else {
            udpMemoryData.remove(ipKey);
            return null;
        }
    }


    public void tcpAdd(String ipKey, byte[] bs) {

        //System.out.println("添加实时数据，key：" + ipKey);
        if (bs != null && bs.length > 0) {
            if (tcpMemoryData.get(ipKey) != null && tcpMemoryData.get(ipKey).size() > 0) {
                Vector<Byte> memoryData = tcpMemoryData.get(ipKey);
                for (byte b : bs) {
                    memoryData.add(b);
                }
                tcpMemoryData.put(ipKey, memoryData);
            } else {
                // 使用线程安全的集合
                Vector<Byte> memoryData = new Vector<>();
                for (byte b : bs) {
                    memoryData.add(b);
                }
                tcpMemoryData.put(ipKey, memoryData);
            }
        }

        //System.out.println("添加完成，缓存大小：" + tcpMemoryData.get(ipKey).size());

    }

    public List<byte[]> getTcpData(String ipKey) {

        //System.out.println("---准备获得缓存数据---");
        if (tcpMemoryData.get(ipKey) != null) {

            //System.out.println("key：" + ipKey);
            //System.out.println("size：" + tcpMemoryData.get(ipKey).size());

            Vector<Byte> memoryData = tcpMemoryData.get(ipKey);

            if (memoryData != null) {

                List<byte[]> rtnData = new ArrayList<>();

                for (int i = 0; i < memoryData.size(); i++) {
                    // 判断是否是“4A 4C”开头（永远从头开始取）
                    if (memoryData.get(0) == 74) {
                        //System.out.println("--- 等于74 ---");
                        if (memoryData.get(1) == 76) {
                            //System.out.println("--- 等于76 ---");
                            // 数据的总长度
                            int totalLength = 0;

                            // 判断数据长度
                            if (memoryData.get(2) != null && memoryData.get(3) != null) {

                                //System.out.println("--- 获得数据长度帧 ---");

                                // 获取数据长度位置相应的值
                                byte one = memoryData.get(2);
                                byte two = memoryData.get(3);

                                byte[] dataLength = new byte[]{one, two};

                                totalLength = ByteUtil.dataLengthToInt(dataLength);

                                //System.out.println("每帧应该取的长度：" + totalLength);
                                //System.out.println("缓存中当前数据个数：" + memoryData.size());

                                // 数据总长度大于要单针的长度
                                if (memoryData.size() >= totalLength) {

                                    //System.out.println("开始取出完整数据帧");

                                    byte[] retByteArray = new byte[totalLength];
                                    //System.out.println("循环放入返回值");
                                    // 循环取出一个完整帧的数据
                                    for (int j = 0; j < totalLength; j++) {
                                        // 先存入再删除
                                        retByteArray[j] = memoryData.get(j);
                                    }
                                    //System.out.println("放入返回值结束");

                                    //System.out.println("删除帧开始");
                                    if (retByteArray != null && retByteArray.length > 0) {
                                        for (int j = 0; j < retByteArray.length; j++) {
                                            memoryData.remove(0);
                                        }
                                        rtnData.add(retByteArray);
                                    }
                                    //System.out.println("删除帧结束");

                                    //System.out.println("取出完整数据帧结束");
                                } else {
                                    //memoryData.remove(0);
                                }

                            }

                        } else {
                            memoryData.remove(0);
                            // System.out.println("--- A删除74 ---");
                            memoryData.remove(1);
                            // System.out.println("--- A删除76 ---");
                        }
                    } else {
                        memoryData.remove(0);
                        //System.out.println("--- B删除76 ---");
                    }
                }
                tcpMemoryData.remove(ipKey);
                return rtnData;
            } else {
                tcpMemoryData.remove(ipKey);
                return null;
            }
        } else {
            tcpMemoryData.remove(ipKey);
            return null;
        }

    }

}
